AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
+AC_ARG_ENABLE([systemd],
+ AS_HELP_STRING([--enable-systemd], [Use systemd]),
+ [enable_systemd=$enableval],
+ [enable_systemd=auto])
+AS_IF([test x$enable_systemd != xno], [
+ AC_MSG_CHECKING([for libsystemd-journal])
+ PKG_CHECK_EXISTS([libsystemd-journal],
+ [have_systemd=yes
+ AC_DEFINE([HAVE_SYSTEMD], [1], [Define if we have systemd])],
+ [have_systemd=no])
+ AC_MSG_RESULT($have_systemd)
+])
+
+AC_MSG_RESULT($enable_systemd)
+
CLUTTER_MIN_VERSION=1.13.4
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.38.1
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
libsecret-unstable gcr-base-3 >= $GCR_MIN_VERSION"
+if test x$have_systemd = xyes; then
+ SHARED_PCS="${SHARED_PCS} libsystemd-journal"
+fi
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
#include "st.h"
#include "gtkactionmuxer.h"
+#ifdef HAVE_SYSTEMD
+#include <systemd/sd-journal.h>
+#include <errno.h>
+#include <unistd.h>
+#endif
+
typedef enum {
MATCH_NONE,
MATCH_SUBSTRING, /* Not prefix, substring */
app);
}
+#ifdef HAVE_SYSTEMD
+/* This sets up the launched application to log to the journal
+ * using its own identifier, instead of just "gnome-session".
+ */
+static void
+app_child_setup (gpointer user_data)
+{
+ const char *appid = user_data;
+ int res;
+ int journalfd = sd_journal_stream_fd (appid, LOG_INFO, FALSE);
+ if (journalfd >= 0)
+ {
+ do
+ res = dup2 (journalfd, 1);
+ while (G_UNLIKELY (res == -1 && errno == EINTR));
+ do
+ res = dup2 (journalfd, 2);
+ while (G_UNLIKELY (res == -1 && errno == EINTR));
+ (void) close (journalfd);
+ }
+}
+#endif
+
/**
* shell_app_launch:
* @timestamp: Event timestamp, or 0 for current event timestamp
ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL,
G_APP_LAUNCH_CONTEXT (context),
G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
+#ifdef HAVE_SYSTEMD
+ app_child_setup, (gpointer)shell_app_get_id (app),
+#else
NULL, NULL,
+#endif
_gather_pid_callback, app,
error);
g_object_unref (context);